/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package muhnes.sizoo.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import muhnes.sizoo.HibernateUtilSeguridad;
import muhnes.sizoo.dal.RolDao;
import muhnes.sizoo.dal.RolDaoImpl;
import muhnes.sizoo.dal.UsuarioDao;
import muhnes.sizoo.dal.UsuarioDaoImpl;
import muhnes.sizoo.modelo.Rol;
import muhnes.sizoo.modelo.Usuario;
import muhnes.sizoo.util.Operacion;

@ManagedBean(name = "usuarioBean")
@ViewScoped
public class UsuarioBean implements Serializable {
    
    private Operacion operacionActual;
    private Usuario usuario;
    private List< Usuario > listaUsuarios;
    private List< Rol > listaRoles;
    private List< SelectItem > itemsRoles;
    private List< SelectItem > itemsTrabajadores;

    public UsuarioBean() {
        usuario = new Usuario();
        operacionActual = Operacion.NINGUNA;
    }
    
    public Operacion getOperacionActual() {
        return operacionActual;
    }

    public void setOperacionActual( Operacion operacionActual ) {
        this.operacionActual = operacionActual;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List< Usuario > getListaUsuarios() {
        if( listaUsuarios == null ) {
            UsuarioDaoImpl dao = new UsuarioDaoImpl(HibernateUtilSeguridad.getSessionFactory());
            listaUsuarios = dao.buscarTodos();
        }
        return listaUsuarios;
    }
    
    public List< Rol > getListaRoles() {
        if( listaRoles == null ) {
            RolDao dao = new RolDaoImpl(HibernateUtilSeguridad.getSessionFactory());
            listaRoles = dao.buscarTodos();
        }
        return listaRoles;
    }
    
    public List< SelectItem > getItemsRoles() {
        if( itemsRoles == null ) {
            itemsRoles = new ArrayList< SelectItem >();
            RolDao dao = new RolDaoImpl(HibernateUtilSeguridad.getSessionFactory());
            for( Rol rol : dao.buscarTodos() ) {
                SelectItem item = new SelectItem( rol, rol.getNombre() );
                itemsRoles.add( item );
            }
        }
        return itemsRoles;
    }
    
    public List< SelectItem > getItemsTrabajadores() {
        if( itemsTrabajadores == null ) {
            itemsTrabajadores = new ArrayList< SelectItem >();
            UsuarioDao dao = new UsuarioDaoImpl(HibernateUtilSeguridad.getSessionFactory());
            for( Usuario trabajador : dao.buscarTodos() ) {
                String nombre = trabajador.getNombre();
                SelectItem item = new SelectItem( nombre, nombre );
                itemsTrabajadores.add( item );
            }
        }
        return itemsTrabajadores;
    }
    
    public List<Rol> getRolesUsuario() {
        List<Rol> rolesUsuario = new ArrayList<Rol>();
        for( Rol rol : usuario.getRoles() ) {
            rolesUsuario.add( rol );
        }
        return rolesUsuario;
    }
    
    public void setRolesUsuario( List<Rol> roles ) {
        Set<Rol> rolesUsuario = new HashSet<Rol>();
        for( Rol rol : roles ) {
            rolesUsuario.add( rol );
        }
        usuario.setRoles(rolesUsuario);
    }
    
    public List<Rol> obtenerRoles( Usuario usuarioSeleccionado ) {
        List<Rol> rolesUsuario = new ArrayList<Rol>();
        for( Rol rol : usuarioSeleccionado.getRoles() ) {
            rolesUsuario.add( rol );
        }
        return rolesUsuario;
    }
    
    public void asignarRoles( Usuario usuarioSeleccionado, List<Rol> roles ) {
        Set<Rol> rolesUsuario = new HashSet<Rol>();
        for( Rol rol : roles ) {
            rolesUsuario.add( rol );
        }
        usuarioSeleccionado.setRoles(rolesUsuario);
    }
    
    public void revocarRol( Usuario usuarioSeleccionado, Rol rol ) {
        usuarioSeleccionado.getRoles().remove(rol);
    }
    
    public void prepararAdicion( ActionEvent event  ){
        usuario = new Usuario();
    }
    
    public void prepararModificacion( Usuario usuario ){
        this.usuario = usuario;
    }
    
    public void prepararEliminacion( Usuario usuario ){
        this.usuario = usuario;
    }
    
    public void guardarUsuario( ActionEvent event ){
        if( operacionActual == Operacion.INSERCION ) {
            agregarUsuario( event );
        }
        else if( operacionActual == Operacion.ACTUALIZACION ) {
            actualizarUsuario( event );
        }
        else {
            operacionActual = Operacion.NINGUNA;
        }
    }

    public void agregarUsuario( ActionEvent event ){
        UsuarioDaoImpl dao = new UsuarioDaoImpl(HibernateUtilSeguridad.getSessionFactory());
        usuario.setContrasenya( "12345" );
        usuario.setEstado("Validando");
        dao.guardar( usuario );
        recrearModelo();
    }
    
    public void actualizarUsuario( ActionEvent event ){
        UsuarioDao dao = new UsuarioDaoImpl(HibernateUtilSeguridad.getSessionFactory());
        dao.actualizar( usuario );
        recrearModelo();
    }
    
    public void eliminarUsuario( ActionEvent event ){
        UsuarioDao dao = new UsuarioDaoImpl(HibernateUtilSeguridad.getSessionFactory());
        //Borrando los registros relacionados en rol_usuario
        usuario.getRoles().clear();
        dao.actualizar(usuario);
        //Borrando el usuario
        dao.eliminar( usuario );
        recrearModelo();
    }
    
    public Boolean tieneErrores( String componente ) {
        
        Iterator<String> componentesInvalidos = FacesContext.getCurrentInstance().getClientIdsWithMessages();
        while ( componentesInvalidos.hasNext() ) {
            String asdf = componentesInvalidos.next();
            System.out.println(asdf);
            if( componente.equals( asdf ) ) {
                System.out.println("True");
                return Boolean.TRUE;
            }
        }
        
        System.out.println("False");
        return Boolean.FALSE;
        
    }

    void recrearModelo() {
        listaUsuarios = null;
        itemsTrabajadores = null;
        operacionActual = Operacion.NINGUNA;
    }

}


